
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // var num1 = 3; 
        // var num2 = 4
        // console.log(num1+num2);

        function test(num1,num2){
            return num1+num2
        }

        // 函数是个盒子  是个工具  是个方法 
        // 函数又是一个数据类型 

        // 基本数据类型 通过typeof 可以返回指定的结果
        // 显示是什么类型  


        //number string boolean undefined object  
        // 基本数据类型 用typeof得到的结果  

        // alert(typeof test);// 函数名+小括号表示执行 
        // 现在为了查看它的数据类型  所以这里不加() 
        // 得到一个结果 是  function 
        // 总结 函数 也是一个数据类型   


        //详见 day8.md 

        /* 
        ### 内存分类

1. 栈内存 
   1. 基本数据类型存在这里
   2. 复杂数据类型的名字存在这里
2. 堆内存 
   1. 复杂数据类型的数据体存在这里  

#### 函数在定义阶段做的事情  

1. 在栈内存开辟一个空间 存放函数的名字
2. 然后在堆内存中开辟一个空间 
3. 把函数体内的代码 一模一样的放到这个堆内存的空间中 (此时这里边不预解析)
4. 把堆内存这个空间的内存地址给到 存放函数名字的栈内存空间   





#### 函数调用阶段做的事情

1. 根据函数的名字找到栈内存  
   1. 栈内存是否有这个名字
   2. 如果有这个名字 那么查看里边是否有这个内存地址  如果有 函数正常执行 
2. 会在调用栈内开辟一个新的函数执行空间  
3. 在执行空间内给形参赋值 
4. 在执行空间内对函数进行预解析 
5. 在执行空间内对函数体内的代码执行一遍 
6. 执行完毕 这个执行空间被销毁 
        
        
        */


    </script>
</body>
</html>